Package org.netbeans.modules.languages.pl_sql.editor.oracletree

Source Code of org.netbeans.modules.languages.pl_sql.editor.oracletree.OUser$ConnectionTry

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.netbeans.modules.languages.pl_sql.editor.oracletree;

import org.netbeans.modules.languages.pl_sql.editor.PasswordJPanel;
import org.netbeans.modules.languages.pl_sql.editor.OConnectionJPanel;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.IOException;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.prefs.BackingStoreException;
import java.util.prefs.Preferences;
import javax.swing.SwingUtilities;
import javax.swing.event.ChangeListener;
import oracle.jdbc.OracleConnection;
import oracle.jdbc.OracleDatabaseMetaData;
import oracle.jdbc.pool.OracleDataSource;
import org.netbeans.api.progress.ProgressHandle;
import org.netbeans.api.progress.ProgressHandleFactory;
import org.netbeans.modules.languages.pl_sql.editor.ConnectionTypes;
import org.netbeans.modules.languages.pl_sql.editor.Utils;
import org.netbeans.modules.languages.pl_sql.editor.explorer.nodes.actions.ChangeOAccessCookieInterface;
import org.netbeans.modules.languages.pl_sql.editor.explorer.nodes.actions.ConnectCookieInterface;
import org.netbeans.modules.languages.pl_sql.editor.explorer.nodes.actions.DeleteCookieInterface;
import org.netbeans.modules.languages.pl_sql.editor.explorer.nodes.actions.DisconnectCookieInterface;
import org.netbeans.modules.languages.pl_sql.editor.explorer.nodes.actions.EditCookieInterface;
import org.netbeans.modules.languages.pl_sql.editor.explorer.nodes.actions.RefreshCookieInterface;
import org.openide.util.Cancellable;
import org.openide.util.ChangeSupport;
import org.openide.util.Exceptions;
import org.openide.util.NbBundle;
import org.openide.util.RequestProcessor;
import org.openide.windows.IOProvider;
import org.openide.windows.InputOutput;
import org.openide.windows.OutputListener;

/**
*
* @author SUMsoft
*/
public class OUser implements RefreshCookieInterface, EditCookieInterface, DeleteCookieInterface,
        ConnectCookieInterface, DisconnectCookieInterface, ChangeOAccessCookieInterface {

    private String UserName,  Password = "";
    private Boolean SavePassword = false;
    private RoleTypes ConnectRole = RoleTypes.normal;
    private OConnectionClass Parent;
    private List<PropertyChangeListener> listeners = Collections.synchronizedList(new LinkedList<PropertyChangeListener>());
    private final ChangeSupport changeSupport = new ChangeSupport(this);
    private OracleConnection conn;
    private boolean IsConnected = false;
    private boolean progressed = false,  connecting = false;
    private ConnectionTry ct = null;
    private ObjectAccessed oaccess = ObjectAccessed.User;
    private int OracleMajorVersion;
    private int OracleMinorVersion;
    private String OracleProductVersion = "";
    private OracleDataSource ods = null;

    public Preferences getPreferencesRoot() {
        return OConnectionClass.getPref_root().node(Parent.getPrefNode()).node(getUserName());
    }

    public OUser(OConnectionClass OParent, String OUserName, String OPassword,
            Boolean OSavePassword, RoleTypes OConnectRole, ObjectAccessed OObjectAccessed) {
        Parent = OParent;
        UserName = OUserName;
        if (OSavePassword) {
            Password = OPassword;
        }
        //Password = OPassword;
        SavePassword = OSavePassword;
        ConnectRole = OConnectRole;
        oaccess = OObjectAccessed;
    }

    public void addChangeListener(ChangeListener listener) {
        changeSupport.addChangeListener(listener);
    }

    public void removeChangeListener(ChangeListener listener) {
        changeSupport.removeChangeListener(listener);
    }

    protected void notifyChange() {
        changeSupport.fireChange();
    }

    public void addPropertyChangeListener(PropertyChangeListener pcl) {
        listeners.add(pcl);
    }

    public void removePropertyChangeListener(PropertyChangeListener pcl) {
        listeners.remove(pcl);
    }

    private void fire(String propertyName, Object old, Object nue) {
        //Passing 0 below on purpose, so you only synchronize for one atomic call:
        PropertyChangeListener[] pcls = listeners.toArray(new PropertyChangeListener[0]);
        for (int i = 0; i < pcls.length; i++) {
            pcls[i].propertyChange(new PropertyChangeEvent(this, propertyName, old, nue));
        }
    }

    public void SaveUser() {
        Preferences pref_user = getPreferencesRoot();
        pref_user.put("UserName", getUserName());
        if (getSavePassword()) {
            pref_user.put("Password", getPassword());
        }
        pref_user.putBoolean("SavePassword", getSavePassword());
        pref_user.put("ConnectRole", getConnectRole().toString());
        pref_user.put("Access", getObjectAccessed().toString());
        try {
            pref_user.flush();
        } catch (BackingStoreException ex) {
            Exceptions.printStackTrace(ex);
        }
    }

    public void RemoveUser() {
        try {
            getPreferencesRoot().removeNode();
            getPreferencesRoot().flush();
        } catch (BackingStoreException ex) {
            Exceptions.printStackTrace(ex);
        }
    }

    @Override
    public String toString() {
        return getUserName();
    }

    public OracleDataSource getOracleDataSource() throws SQLException {
        if (ods == null) {
            ods = new OracleDataSource();
            ods.setDriverType("thin");
            ods.setServerName(Parent.getServerName());
            ods.setNetworkProtocol("tcp");
            if (Parent.getConnectionType() == ConnectionTypes.SID) {
                ods.setDatabaseName(Parent.getDatabaseName());
            } else {
                ods.setServiceName(Parent.getDatabaseName());
            }
            ods.setPortNumber(Parent.getPort());
            ods.setUser(UserName);
            if (SavePassword) {
                ods.setPassword(Password);
            }
            //ods.setPassword(Password);
            if (ConnectRole != RoleTypes.normal) {
                java.util.Properties prop = new java.util.Properties();
                prop.put("internal_logon", ConnectRole.toString());
                ods.setConnectionProperties(prop);
            }
        }
        return ods;
    }

    public String getOracleVersion() {
        return OracleMajorVersion == 0 ? "" : Integer.toString(OracleMajorVersion) + '.' + Integer.toString(OracleMinorVersion);
    }

    public int getOracleMinorVersion() {
        return OracleMinorVersion;
    }

    public String getOracleProductVersion() {
        return OracleProductVersion;
    }

    public int getOracleMajorVersion() {
        return OracleMajorVersion;
    }

    public RoleTypes getConnectRole() {
        return ConnectRole;
    }

    public Boolean getSavePassword() {
        return SavePassword;
    }

    public String getUserName() {
        return UserName;
    }

    public String getPassword() {
        return Password;
    }

    public OConnectionClass getParent() {
        return Parent;
    }

    public void setConnectRole(RoleTypes ConnectRole) {
        this.ConnectRole = ConnectRole;
    }

    public void setPassword(String Password) {
        this.Password = Password;
    }

    public void setSavePassword(Boolean SavePassword) {
        this.SavePassword = SavePassword;
    }

    public void setUserName(String UserName) {
        String oldUserName = this.UserName;
        this.UserName = UserName;
        fire("UserName", oldUserName, UserName);
    }

    public synchronized void setIsConnected(boolean b) {
        boolean oldb = this.IsConnected;
        this.IsConnected = b;
        fire("IsConnected", oldb, b);
        Parent.fire("IsConnected", oldb, b);
    }

    public synchronized boolean getIsConnected() {
        return IsConnected;
    }

    public synchronized OracleConnection getConn() {
        OracleConnection oc = null;
        try {
            while (oc == null) {
                oc = (OracleConnection) ods.getConnection();
            }
        } catch (SQLException ex) {
            Exceptions.printStackTrace(ex);
        }
        return oc;
    }

    public void Delete() {
        this.RemoveUser();
        Parent.getUsers().remove(this);
    }

    public void Edit() {
        OConnectionJPanel oc = new OConnectionJPanel();
        oc.ShowEditUserDialog(this);
        if (oc.getIsSaved()) {
            if (oc.getUserName().compareTo(this.getUserName()) != 0) {
                this.RemoveUser();
            }
            setUserName(oc.getUserName());
            setSavePassword(oc.getSaveUserPassword());
            if (oc.getSaveUserPassword()) {
                setPassword(oc.getPassword());
            }
            setConnectRole(oc.getConnectRole());
        }
    }

    private InputOutput getio() {
        return IOProvider.getDefault().getIO(Parent.toString(), false);
    }

    public synchronized void OutputMsg(String msg, OutputListener ol, boolean error) {
        if (error) {
            getio().select();
            if (ol != null) {
                try {
                    getio().getErr().println(msg, ol);
                } catch (IOException ex) {
                    Exceptions.printStackTrace(ex);
                }
            } else {
                getio().getErr().println(msg);
            }
            getio().getErr().close();
        } else {
            if (ol != null) {
                try {
                    getio().getOut().println(msg, ol);
                } catch (IOException ex) {
                    Exceptions.printStackTrace(ex);
                }
            } else {
                getio().getOut().println(msg);
            }
            getio().getOut().close();
        }
    }

    private synchronized void EnableHints() {
        if (IsConnected) {
            Statement st = null;
            try {
                OracleDatabaseMetaData meta = (OracleDatabaseMetaData) conn.getMetaData();
                OracleMajorVersion = meta.getDatabaseMajorVersion();
                OracleMinorVersion = meta.getDatabaseMinorVersion();
                OracleProductVersion = meta.getDatabaseProductVersion();
                //conn.setPlsqlWarnings("'ENABLE:ALL'");

                if (OracleMajorVersion >= 10) {
                    st = conn.createStatement();
                    st.execute("ALTER SESSION SET PLSQL_WARNINGS='ENABLE:ALL'");
                    st.close();
                }
            } catch (SQLException ex) {
                // Do nothing because Oracle version < 9i
                Exceptions.printStackTrace(ex);
            }
        }
    }

    public synchronized void Connect() {
        if (!IsConnected && !connecting && !progressed) {
            ct = new ConnectionTry();
            ct.post();
        }
    }

    public synchronized void Disconnect() {
        if (IsConnected) {
            try {
                conn.close();
                ods.close();
                OutputMsg(NbBundle.getMessage(Utils.getCommonClass(), "LBL_UserDisconnected", UserName), null, false);
                this.notifyChange();
            } catch (SQLException ex) {
                OutputMsg(ex.getMessage(), null, true);
            }

            setIsConnected(false);
        }
    }

    class ConnectionTry {

        private RequestProcessor rp;
        private RequestProcessor.Task task;
        private ProgressHandle progressHandle = ProgressHandleFactory.createHandle(null, new Cancellable() {

            public boolean cancel() {
                //IsCanceled = true;
                ct.stop();
                OutputMsg(Utils.getBundle().getString("LBL_Canceled"), null, false);
                stopProgress();
                connecting = false;
                return true;
            }
        });

        public ConnectionTry() {
            rp = new RequestProcessor(ConnectionTry.class.getName(), 1, true);

            task = rp.create(new Runnable() {

                public void run() {
                    try {
                        connecting = true;
                        boolean connect = true;
                        OracleDataSource ods = getOracleDataSource();
                        if (!getSavePassword()) {
                            PasswordJPanel pjp = new PasswordJPanel();
                            pjp.ShowDialog(getUserName());
                            connect =
                                    pjp.getisOK();
                            if (connect) {
                                ods.setPassword(pjp.getPassword());
                            }

                        }
                        if (connect) {
                            String localmsg = NbBundle.getMessage(Utils.getCommonClass(), "LBL_ConnectingToAs", Parent.toString(), UserName);
                            startProgress(localmsg);

                            ods.setConnectionCachingEnabled(true);
                            java.util.Properties props = ods.getConnectionProperties() == null ? new java.util.Properties() : ods.getConnectionProperties();
                            props.put(OracleConnection.CONNECTION_PROPERTY_THIN_VSESSION_PROGRAM, "PL/SQL Editor for NetBeans");
                            ods.setConnectionProperties(props);

                            java.util.Properties props_cache = new java.util.Properties();
                            props_cache.setProperty("MaxLimit", "2");
                            ods.setConnectionCacheProperties(props_cache);

                            OutputMsg(localmsg, null, false);
                            conn =
                                    (OracleConnection) ods.getConnection();
                            if (conn != null && !conn.isClosed()) {
                                setIsConnected(true);
                                OutputMsg(NbBundle.getMessage(Utils.getCommonClass(), "LBL_ConnectedAs", UserName), null, false);
                                EnableHints();
                                notifyChange();
                                conn.close();
                            }
                        }

                    } catch (SQLException ex) {
                        setIsConnected(false);
                        if (progressed) {
                            OutputMsg(ex.getMessage(), null, true);
                        }
                    } finally {
                        stopProgress();
                        connecting = false;
                    }
                }
            });
        }

        public void post() {
            rp.post(task);
        }

        public void stop() {
            task.cancel();
            if (conn != null) {
                try {
                    conn.cancel();
                    conn = null;
                } catch (SQLException ex) {
                    //Exceptions.printStackTrace(ex);
                }
            }
            if (ods != null) {
                try {
                    ods.close();
                    ods = null;
                } catch (SQLException ex) {
                    //Exceptions.printStackTrace(ex);
                }
            }
        }

        private void startProgress(final String msg) {
            SwingUtilities.invokeLater(new Runnable() {

                public void run() {
                    try {
                        progressHandle.setDisplayName(msg);
                        progressHandle.start();
                        progressed = true;
                    } catch (IllegalStateException e) {
                        progressed = false;
                        Exceptions.printStackTrace(e);
                    }
                }
            });
        }

        private void stopProgress() {
            SwingUtilities.invokeLater(new Runnable() {

                public void run() {
                    if (progressed) {
                        progressHandle.finish();
                        progressed = false;
                    //progressHandle = null;
                    }
                }
            });

        }
    }

    public void Refresh() {
        this.notifyChange();
    }

    @Override
    protected void finalize() {
        this.Disconnect();
        this.conn = null;
        this.ods = null;
    }

    public void ChangeOAccess(ObjectAccessed oa) {
        this.oaccess = oa;
        Preferences pref_user = getPreferencesRoot();
        pref_user.put("Access", getObjectAccessed().toString());
        this.Refresh();
    }

    public ObjectAccessed getObjectAccessed() {
        return oaccess;
    }
}
TOP

Related Classes of org.netbeans.modules.languages.pl_sql.editor.oracletree.OUser$ConnectionTry

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.